package model

import (
	"time"

	. "gddgame.cc/galaxy/common/dsl/game/badge"
	"gddgame.cc/galaxy/common/dsl/game/stat"
	"gddgame.cc/galaxy/utils/orm"
)

var (
	DefaultUser = &User{
		// 在创建用户时重置
		Level: 1,
		Grade: 1,
	}
)

type User struct {
	// 作为内部id，关联内部数据
	Id int `json:"id" orm:"auto" sql:"INT"`
	// 链接平台的openid，通信中string的使用：可以不需要进行hashid处理
	// 使用平台相关服务时的user识别
	OpenId string `json:"open_id" sql:"VARCHAR"`

	// 等级，以及当前等级的经验值
	Level int `json:"level" sql:"INT"`
	XP    int `json:"xp" sql:"INT"`
	Score int `json:"score" sql:"INT"`

	// 军阶，以及当前军阶的经验值
	Grade     int `json:"grade" sql:"INT"`
	Point     int `json:"point" sql:"INT"`
	LastPoint int `json:"last_point" sql:"INT"`

	CreateTime *time.Time `json:"create_time" orm:"createTime" sql:"DATETIME"`
	UpdateTime *time.Time `json:"update_time" orm:"updateTime" sql:"DATETIME"`

	// 用户模型
	BaseId int    `json:"base_id" sql:"INT"`
	Entity string `json:"entity" sql:"VARCHAR"`

	// 用户装备信息： 与实际游戏同步
	Weapon  int   `json:"weapon" sql:"INT"`
	Machine int   `json:"machine" sql:"INT"`
	Items   []int `json:"items" sql:"JSON"`

	// 用户的货币信息：与实际游戏同步
	Gold    int `json:"gold" sql:"INT"`
	Diamond int `json:"diamond" sql:"INT"`

	// 已获得徽章信息
	Badges map[int]*UserBadge `json:"badges" sql:"JSON"`

	// 宝箱数据
	Gifts map[string]int `json:"gifts" sql:"JSON"`

	*stat.StatInfo

	*orm.Schema `orm:"schema"`

	ItemMap map[int]*UserItem
}

// 计算当前等级以及剩余经验
func (user *User) ComputeLevel() {
	if user.Level >= len(XPList) {
		// 达到最高等级，xp重置为0
		user.XP = 0
		return
	}
	targetXP := XPList[user.Level-1]
	if XPNumber(user.XP) > targetXP {
		user.Level += 1
		user.XP -= int(targetXP)
		user.ComputeLevel()
	}
}

// 计算当前军阶
func (user *User) ComputeGrade(topUserMap map[int]bool) {
	if _, ok := topUserMap[user.Id]; ok {
		user.Point = int(MaxPoint)
	} else {
		if user.Point > MaxWeekPoint {
			user.Point = MaxWeekPoint
		}
	}
	var current int
	current = int(float64(user.LastPoint)*0.8) + user.Point
	if user.LastPoint-current > MaxReducePoint {
		current = user.LastPoint - MaxReducePoint
	}
	if current < 0 {
		current = 0
	}
	for index, target := range PointList {
		if PointNumber(current) < target {
			user.Grade = index + 1
			break
		}
	}
	user.LastPoint = user.Point
	user.Point = 0
}

func (user *User) GetId() int {
	return user.Id
}

func (user *User) GetOpenId() string {
	return user.OpenId
}

func (user *User) GetStats() *stat.StatInfo {
	return user.StatInfo
}

func (user *User) SetStats(data *stat.StatInfo) {
	user.StatInfo = data
}

func (user *User) SetSchema(schema *orm.Schema) {
	user.Schema = schema
}
